﻿namespace EnergyGeneratorSim
{
    using System;
    using EnergyGeneratorSim.Parameters;

    class Program
    {
        static void Main(string[] args)
        {
            var app = new RaumenergiemotorDFEM();
            app.LogCallback = (string message) => Console.Write(message);

            var param = CreateExampleParameter();
            var result = app.Calculate(param);
        }

        private static SimulationParameters CreateExampleParameter()
        {
            var param = new SimulationParameters();

            param.AnzP = 100000000;                         // Zum Lösen der Dgl.: Anzahl der tatsächlich berechneten Zeit-Schritte
            param.dt = 43E-9;                               // Sekunden, Zum Lösen der Dgl.: Dauer der Zeitschritte zur iterativen Lsg. der Dgl.
            param.Abstd = 1;                                // Nur für die Vorbereitung, nicht zum Lösen der Dgl.: Jeden wievielten Punkt soll ich plotten ins Excel
            param.PlotAnfang = 0000;                        // Zum Lösen der Dgl.: Erster-Plot-Punkt: Anfang des Daten-Exports nach Excel
            param.PlotEnde = 100000000;                     // Zum Lösen der Dgl.: Letzter-Plot-Punkt: Ende des Daten-Exports nach Excel
            param.PlotStep = 4000;                          // Zum Lösen der Dgl.: Schrittweite des Daten-Exports nach Excel

            param.Inductor.Ninput = 100;                    // Zahl der Wicklungen der Input-Spule
            param.Inductor.Nturbo = 9;                      // Zahl der Wicklungen der Turbo-Spule
            param.Inductor.Nebeninput = 10;                 // Windungen nebeneinander in der Input-Spule
            param.Inductor.Ueberinput = 10;                 // Windungen uebereinander in der Input-Spule
            param.Inductor.Nebenturbo = 3;                  // Windungen nebeneinander in der Turbo-Spule
            param.Inductor.Ueberturbo = 3;                  // Windungen uebereinander in der Turbo-Spule
            param.Inductor.DD = 0.010;                      // Meter, Durchmesser des Spulendrahtes zur Angabe der Drahtstärke

            //  Dauermagnet-Emulation:  Magnetfeld muß nach Messung mit Hall-Sonde eingegeben werden.
            param.PermanentMagnet.Bsw = 1E-2;               // Magnetfeld-Speicherung nach *1 von S.2 in Zentimeter-Schritten
            // Ich emuliere hier das Magnetfeld eines 1T-Magneten durch ein Spulenpaar nach *1 von S.5
            param.PermanentMagnet.MEyo = 0.05;              // y-Koordinaten der Magnetfeld-Emulationsspulen nach *1 von S.5
            param.PermanentMagnet.MEro = 0.01;              // Radius der Magnetfeld-Emulationsspulen nach *1 von S.5  
            param.PermanentMagnet.MEI = 15899.87553474;     // Strom des Magnetfeld-Emulationsspulenpaares nach *1 von S.5, Angabe in Ampere

            //  Allgemeine technische Größen:
            param.General.rho = 1.35E-8;                    // Ohm*m}    {Spez. elektr. Widerstand von Kupfer, je nach Temperatur, Kohlrausch,T193
            param.General.rhoMag = 7.8E3;                   // kg/m^3}  {Dichte des Magnet-Materials, Eisen, Kohlrausch Bd.3
            param.General.CT = 101.7E-6;                    // 150E-6;} {Farad}    {Kapazität des Kondensators, der mit in der Turbo-Spule (!) in Reihe geschaltet
            param.General.CI = 100E-6;                      // Farad}   {Kapazität des Kondensators, der mit in der Input-Spule (!) in Reihe geschaltet
            //  Sonstige (zur Eingabe):
            param.General.Rlast = 0.030;                    // Ohm}   {Ohm'scher Lastwiderstand im LC-Turbo-Schwingkreis
            param.General.UmAn = 30000;                     // U/min} {Anfangsbedingung mechanisch - Rotierender Magnet: Startdrehzahl
            param.General.Uc = 0;                           // Volt}  
            param.General.Il = 0;                           //Ampere} {Anfangsbedingung elektrisch - Kondensatorspannung = 0, Kein Spulenstrom

            //  Mechanische Leistungs-Entnahme (geschwindigkeits-proportional, aber nicht nur Reibung:
            param.General.crAnfang = 45E-6;                 // Koeffizient einer geschwindigkeits-proportionalen Reibung zwecks mechanischer Leistungs-Entnahme
            param.General.phipZiel = 30100;                 // Ziel-Drehzahl, an der die Reibungs-Nachregelung ausgerichtet wird.

            return param;
        }
    }
}
